#include<t_stdio.h>
#include<t_file.h>
#include<stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#include<unistd.h>
#define port 8888
static int s;
static struct iovec*vc=NULL;
void  sig_proccess(int signo){
 printf("catch a exit signal..\n");
    free(vc);
    _exit(0);
}

void sig_pipe(int signo){
    printf("catch a sigpipe signal..\n");
    free(vc);
    _exit(0);

}

//业务处理函数
void process_conn_client(int s){
   char buffer [30];
    ssize_t size=0; //向量的缓冲区
    
    //申请3个向量空间
    struct iovec * v = (struct iovec *)malloc(3*sizeof(struct iovec));
    if(!v) E_MSG("malloc",-1);

    vc = v;//挂接全局变量，易于释放管理

    v[0].iov_base= buffer;//每个向量十个地址空间
    v[1].iov_base= buffer+10;
    v[2].iov_base= buffer+20;
    v[0].iov_len = v[1].iov_len = v[2].iov_len = 10;//初始化长度为10

    int i=0;
    for(;;){
        //从标准输入中读取数据放入缓冲区buffer中
        size = read(0,v[0].iov_base,10);//只有十个字节
        if(size>0){
            v[0].iov_len = size;
            writev(s,v,1);//发送给服务器
            v[0].iov_len = v[1].iov_len = v[2].iov_len = 10;
            size=readv(s,v,3);//从服务器读取数据
            for(i = 0;i<3;i++){
                if(v[i].iov_len > 0)
                {
                    write(1,v[i].iov_base,v[i].iov_len);//将服务区处理后数据输出
                }
            }                  
        }

    }

}
int main(int argc ,char * argv[])
{
    struct sockaddr_in server_addr;//服务器结构地址
    int err;
    if(argc == 1){
        printf("pls input server addr\n");
        return 0;
    }//没有输入指令参数
    signal(SIGINT,sig_proccess);
    signal(SIGPIPE,sig_pipe);//设置信号掩码

    s = socket(AF_INET,SOCK_STREAM,0);//创建客户端套接字
    if(s < 0)E_MSG("socket",-1);

    //设置服务器地址
     bzero(&server_addr,sizeof(server_addr));//将地址清0
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htons(INADDR_ANY);//本地地址
    server_addr.sin_port=htons(port);//设置端口

    inet_pton(AF_INET,argv[1],&server_addr.sin_addr);//将用户输入的字符串ip转化为二进制ip
    connect(s,(struct sockaddr *)&server_addr,sizeof(server_addr));//连接服务器
    process_conn_client(s);
    return 0;
}